/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package src.j2ee.compumake.controladores;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import src.j2ee.compumake.dao.DAOArquitectura;
import src.j2ee.compumake.dao.DAOMarca;
import src.j2ee.compumake.dao.DAOProcesador;
import src.j2ee.compumake.dao.DAOProducto;
import src.j2ee.compumake.dao.DAOSocket;
import src.j2ee.compumake.dao.DAOSucursal;
import src.j2ee.compumake.dominio.Arquitectura;
import src.j2ee.compumake.dominio.Marca;
import src.j2ee.compumake.dominio.Procesador;
import src.j2ee.compumake.dominio.Socket;
import src.j2ee.compumake.dominio.Sucursal;
import src.j2ee.compumake.utileria.Utileria;

/************************************************************************
 **                                                                    **
 ** Nombre: RegistroProcesador.java                                    **
 ** Version: v1.0.0                                                    **
 ** Autor: Eric                                                        **
 ** Creado: 25/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/

@MultipartConfig
public class RegistroProcesador extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        Procesador nuevoProcesador = obtenerProcesador(request, response);
        Sucursal nuevaSucursal = obtenerSucursal(request, response);
        
        try{
            DAOProducto daoProducto = new DAOProducto();
            boolean exitoInsertaProducto;
            exitoInsertaProducto = daoProducto.insertarProducto(nuevoProcesador, nuevaSucursal);
            
            if(exitoInsertaProducto){
                
                DAOProcesador daoProcesador = new DAOProcesador();
                Procesador procesador = daoProcesador.buscaProcesador(idUltimoProducto);
                
                agregarImagen(request, response, procesador);
            }
            
            response.sendRedirect("index.jsp");
        }
        finally{
            
        }
    }
    
    private Procesador obtenerProcesador(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
        
        String nombre = Utileria.getTexto(req.getPart("nombre"));
        int existencia = Integer.parseInt(Utileria.getTexto(req.getPart("existencia")));
        double precio = Double.parseDouble(Utileria.getTexto(req.getPart("precio")));
        String marca = Utileria.getTexto(req.getPart("marca"));
        
        String socket = req.getParameter("socket");
        String arquitectura = req.getParameter("arquitectura");
        
        Socket nuevoSocket = obtenerSocket(socket);
        if(nuevoSocket == null){
            mostrarMensajeError("Tipo de socket no registrado", req, res);
        }
        
        Arquitectura nuevaArquitectura = obtenerArquitectura(arquitectura);
        if(nuevaArquitectura == null){
            mostrarMensajeError("Tipo de arquitectura no registrada", req, res);
        }
        
        Marca nuevaMarca = obtenerMarca(marca);
        if(nuevaMarca == null){
            mostrarMensajeError("Marca no registrada", req, res);
        }
        
        Procesador procesador = new Procesador(nuevoSocket, nuevaArquitectura, nombre, nuevaMarca, existencia, precio);
        
        String URLImagen = obtenerURLImagen(req, res, nombre);
        
        procesador.setRutaImagen(URLImagen);
        
        return procesador;
    }
    
    private String obtenerURLImagen(HttpServletRequest req, HttpServletResponse res, String nombre) throws ServletException, IOException{
        
        DAOProcesador daoProcesador = new DAOProcesador();
        ArrayList<Procesador> listaDeProcesadores = new ArrayList<>();
        listaDeProcesadores = daoProcesador.listarProcesadores();
        
        String URLImagen = "";
        int idDelUltimoProcesador = 1;
        
        if(listaDeProcesadores.isEmpty()){
            idUltimoProducto = idDelUltimoProcesador;
            URLImagen = "Fotos/Productos/Procesador"+idUltimoProducto+".jpg";
        }else{
            for(int i=0; i<listaDeProcesadores.size(); i++){
                if(idDelUltimoProcesador < listaDeProcesadores.get(i).getClave()){
                    idDelUltimoProcesador = listaDeProcesadores.get(i).getClave();
                }
                if(nombre.equals(listaDeProcesadores.get(i).getNombre())){
                    Procesador nuevoProcesador = listaDeProcesadores.get(i);
                    return "Fotos/Productos/Procesador"+nuevoProcesador.getClave();
                }
            }
            idUltimoProducto = idDelUltimoProcesador + 1;
            URLImagen = "Fotos/Productos/Procesador"+idUltimoProducto+".jpg";
        }
        return URLImagen;
    }
    
    private Socket obtenerSocket(String socket){
        
        Socket nuevoSocket;
        DAOSocket daoSocket = new DAOSocket();
        
        ArrayList<Socket> listaDeSockets = new ArrayList<>();
        listaDeSockets = daoSocket.listarsockets();
        
        for(int i=0; i<listaDeSockets.size(); i++){
            if(socket.equalsIgnoreCase(listaDeSockets.get(i).getSocket())){
                nuevoSocket = listaDeSockets.get(i);
                return nuevoSocket;
            }
        }
        
        return null;
    }
    
    private Arquitectura obtenerArquitectura(String arquitectura){
        
        Arquitectura nuevaArquitectura;
        DAOArquitectura daoArquitectura = new DAOArquitectura();
        
        ArrayList<Arquitectura> listaDeArquitecturas = new ArrayList<>();
        listaDeArquitecturas = daoArquitectura.listarArquitecturas();
        
        for(int i=0; i<listaDeArquitecturas.size(); i++){
            if(arquitectura.equalsIgnoreCase(listaDeArquitecturas.get(i).getDescripcion())){
                nuevaArquitectura = listaDeArquitecturas.get(i);
                return nuevaArquitectura;
            }
        }
        
        return null;
    }
    
    private Marca obtenerMarca(String marca){
        
        Marca nuevaMarca;
        DAOMarca daoMarca = new DAOMarca();
        
        ArrayList<Marca> listaDeMarcas = new ArrayList<>();
        listaDeMarcas = daoMarca.listarMarcas();
        
        for(int i=0; i<listaDeMarcas.size(); i++){
            if(marca.equalsIgnoreCase(listaDeMarcas.get(i).getNombre())){
                nuevaMarca = listaDeMarcas.get(i);
                return nuevaMarca;
            }
        }
        
        return null;
    }
    
    private Sucursal obtenerSucursal(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
        
        String sucursal = Utileria.getTexto(req.getPart("sucursal"));
        
        Sucursal nuevaSucursal;
        DAOSucursal daoSucursal = new DAOSucursal();
        
        ArrayList<Sucursal> listaDeSucursales = new ArrayList<>();
        listaDeSucursales = daoSucursal.listarSucursales();
        
        for(int i=0; i<listaDeSucursales.size(); i++){
            if(sucursal.equalsIgnoreCase(listaDeSucursales.get(i).getNombre())){
                nuevaSucursal = listaDeSucursales.get(i);
                return nuevaSucursal;
            }
        }
        
        return null;
    }
    
    private void agregarImagen(HttpServletRequest req, HttpServletResponse res, Procesador procesador) throws ServletException, IOException{
        
        if(req.getPart("imagen").getSize() > 0){
            if(req.getPart("imagen").getContentType().contains("image") == false){
                mostrarMensajeError("El archivo adjunto no es una imagen", req, res);
            }
            else{
                creaDirectorioDeImagenes();
                String nomArchivo = getServletContext().getRealPath("/Fotos/Productos/Procesador")+procesador.getClave();
                boolean ok = Utileria.guardaImagen(req.getPart("imagen"), nomArchivo);
                if(ok){
                    System.out.println(nomArchivo);
                }
            }
        }
    }
    
    private void mostrarMensajeError(String mensajeDeError, HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Mensaje de Error</title>");  
            out.println("<link rel=\"stylesheet\" href=\"CSS/compumake.css\" type=\"text/css\" media=\"screen\" />");
            out.println("</head>");
            out.println("<body>");
            out.println("<div class=\"titulo_contenido\">");
            out.println("<p>Error de registro</p>");
            out.println("</div>");
            out.println("<div class=\"subtitulo_contenido\">");
            out.println("<p>"+ mensajeDeError +"</p>");
            out.println("</div>");
            out.println("<p class=\"botonAtras\"><a href=\"registroUsuario.jsp\"><img src=\"CSS/IMAGES/atras.png\" alt=\"\" width=\"34\" height=\"34\" border=\"0\" /></a></p>");
            out.println("</body>");
            out.println("</html>");
        } finally {            
            out.close();
        }
        
    }

    private void creaDirectorioDeImagenes(){
		
        File file = new File(getServletContext().getRealPath("/Fotos/Productos/"));
        if(file.exists()==false){
            file.mkdirs();
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private int idUltimoProducto = 0;

}
